import axios from 'axios'
import store from '../store/index'
import router from '../router/index'

// 定时器数组，一般我们都是等请求时间超过1秒后，才出现loading状态，如果一开始就提示，用户体验也不是很好
let timers = [],
    timer = null;


// 配置基准地址
let host = 'http://112.126.81.1:8081'

// 判断是否为开发环境 , 开发环境 代理proxy才会生效
if (process.env.NODE_ENV === 'development') host = '/ajax'

// 创建axios实例
const http = axios.create({
    baseURL: host,
    timeout: 20000
})
// 配置 请求拦截器 (请求拦截器可以拦截到所有的配置项)
http.interceptors.request.use(config => {
    // 携带上token
    config.headers.token = localStorage.getItem('token')
    // 每次请求开始前 都开启延迟定时器，并记录在数组中，便于响应回来后 清除  
    timer = setTimeout(() => { 
        !store.state.isAppending && store.commit("changeAppending", true);
    },600);
    timers.push(timer);
    return config
}, error => {
    // 如果失败 就返回失败信息
    return Promise.reject(error)
})

http.interceptors.response.use(response => {
    // 请除所有的定时器;
    clearAllTimer();
    // 去除 loading 效果 修改changeAppending状态
    store.commit("changeAppending", false);
    // 这样配置后 开发中拿到的后台数据只有data主体内容 不用再二次处理了
    const res = response.data  
    if(res.code == '00001' && res.msg == '请先登录'){
        window.localStorage.removeItem('token')
        router.push({name:'Login'})
    }
    return res
}, error => {
    clearAllTimer();
    store.commit("changeAppending", false);
    return Promise.reject(error)
})

function clearAllTimer() {
    timers.forEach(item => {
        clearTimeout(item);
    });
    timers = [];
}

export default http